package com.demo.chapter4stream;

import java.util.List;
import java.util.stream.Collectors;

import com.demo.domain.Dish;

/**流：从支持数据处理操作的源生成的元素序列，流的目的在于表达计算，集合讲的是数据，流讲的是计算。
 * 由列表生成的流，其元素顺序与列表一致，流只能消费一次，流利用了内部迭代，可以连接起来的流操作称为中间操作，关闭流的操作称为终端操作。
 * @author dell
 *
 */
public class Demo {

	public static void demo1(){
		List<String> list = Dish.menu.stream()
			.filter(d -> d.getCalories() > 300)
			.map(Dish::getName)
			.limit(3)
			.collect(Collectors.toList());

		System.out.println(list);
	}

	/**
	 * 尽管很多菜品的热量都高于300，但只选出了前三种，这是因为limit操作和一种称为短路的技巧，
	 * 尽管filter和map是两个独立的操作，但它们合并到同一次遍历中了，这称为循环合并
	 */
	public static void demo2(){
		List<String> list = Dish.menu.stream()
				.filter(d -> {
					System.out.println("filtering " + d.getName());
					return d.getCalories() > 300;
				})
				.map(d -> {
					System.out.println("mapping " + d.getName());
					return d.getName();
				})
				.limit(3)
				.collect(Collectors.toList());

		System.out.println(list);
	}

	public static void main(String[] args) {
		demo1();
		demo2();
	}

}
